<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>proxy实例的construct方法</title>
</head>
<body>
  <script>
    // construct()方法用于拦截new命令，下面是拦截对象的写法
    const handler = {
      construct (target, args, newTarget) {
        return new target(...args)
      }
    };
    /**
     * construct()方法可以接受三个参数
     * --taget: 目标对象
     * --args: 构造函数的参数数组。
     * --newTarget: 创造实例对象时，new 命令作用的构造函数(下面例子的p)
    */
   const p = new Proxy(function () {}, {
     construct: function(target, args) {
       console.log('called: ' + args.join(', '));
       return { value: args[0] * 10 }
     }
   });
   var a = (new p(1)).value;// "called: 1"
   console.log(a) // 10
   /**
    * construct() 方法返回的必须是一个对象，否则会报错。
    * 另外，由于construct() 拦截的是构造函数，所以它的目标对象必须是函数，否则会报错。
    *
    * --注意： construct()方法中的this指向的是handler, 而不是实例对象。
   */
   const handler1 = {
     construct: function(target, args) {
       console.log(this === handler1); // true
       return new target(...args)
     }
   };
   let p1 = new Proxy(function () {}, handler1);
   new p1(); //true
  </script>
</body>
</html>